﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Storage;

namespace Remindme.AppUtils
{
    public class SettingsManager
    {
        ApplicationDataContainer localSettings;

        const string AccessTokenKeyName = "AccessToken";
        const string UserNameKeyName = "UserName";

        const string AccessTokenDefault = "";
        const string UserNameDefault = "";

        public SettingsManager()
        {
            try
            {
                localSettings = ApplicationData.Current.LocalSettings;
            }
            catch (Exception ex)
            {
            }
        }

        /// <summary>
        /// Agrega o actualiza un valor de las preferencias y
        /// confguración de la aplicación.
        /// </summary>
        /// <param name="key">La clave con la que se guarda el valor</param>
        /// <param name="value">Valor a guardar o actualizar</param>
        /// <returns>Verdadero si la preferencia es creada o modificada, 
        /// falso en caso contrario</returns>
        public bool AddOrUpdate(string key, object value)
        {
            bool valueChanged = false;

            if (localSettings.Values.ContainsKey(key))
            {
                if (localSettings.Values[key] != value)
                {
                    localSettings.Values[key] = value;
                    valueChanged = true;
                }
            }
            else
            {
                localSettings.Values.Add(key, value);
                valueChanged = true;
            }

            return valueChanged;
        }

        /// <summary>
        /// Obtiene el valor de una preferencia guardada o un
        /// valor por defecto en caso de no existir dicha preferencia.
        /// </summary>
        /// <typeparam name="T">El tipo que debe devolver la función</typeparam>
        /// <param name="key">La clave de la preferencia</param>
        /// <param name="defaultValue">Un valor por defecto en caso de no existir la preferencia</param>
        /// <returns>El valor guardado en la preferencia o un valor por defecto</returns>
        public T GetValueOrDefault<T>(string key, T defaultValue)
        {
            T value;

            if (localSettings.Values.ContainsKey(key))
            {
                value = (T)localSettings.Values[key];
            }
            else
            {
                value = defaultValue;
            }

            return value;
        }

        public void Save()
        { 
            // Para Windows 8 esta función no es necesaria
        }

        public string AccessTokenSetting
        {
            get
            {
                return GetValueOrDefault<string>(AccessTokenKeyName, AccessTokenDefault);
            }
            set
            {
                AddOrUpdate(AccessTokenKeyName, value);
                Save();
            }
        }

        public string UserNameSetting
        {
            get
            {
                return GetValueOrDefault<string>(UserNameKeyName, UserNameDefault);
            }
            set
            {
                AddOrUpdate(UserNameKeyName, value);
                Save();
            }
        }
    }
}
